package com.guoq.shiro;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.shiro.authc.AccountException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.guoq.constant.SessionDatas;
import com.guoq.pojo.User;
import com.guoq.service.impl.UserServiceImpl;

/**
 * 授权验证
 * 
 * @项目名称:
 * @类名:ShiroRealm.java
 * @描述:
 * @创建人: chen.an
 * @创建时间: 2017年6月28日下午7:21:47
 * @修改人:
 * @修改时间: @修改备注：
 * @version 1.0
 */
public class ShiroRealm extends AuthorizingRealm {

	@Autowired
	public UserServiceImpl userservice;
	/**
	 * 登录信息和用户验证信息验证
	 */
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		
		String username = (String) token.getPrincipal(); // 得到用户名
		//String password = new String((char[]) token.getCredentials()); // 得到密码
		
		User user = this.userservice.getUserByUsername(username);
		if(user == null){ 
			throw new AccountException("用户不存在！");
		}else if(user.getStatus() == 1){
			throw new UserDisableException("用户已被禁用！");
		}
		
		this.getSession().setAttribute(SessionDatas.USER, user);
		this.getSession().setAttribute(SessionDatas.USER_ACCOUNT, username);
//		this.getSession().setAttribute(SessionDatas.USER_NAME, user.getNickname());
//		this.getSession().setAttribute(SessionDatas.USER_ROLEID, user.get("rid"));

		//文件路径
//		this.getSession().setAttribute("resulturl", PropertiesLoader.getPropertiesVal("result"));
		return new SimpleAuthenticationInfo(user.getUsername(), user.getPwd(), getName());
	}

	/**
	 * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法
	 * 
	 * @时间：2017年6月28日 下午7:35:35
	 * @作者：chen.an
	 * @param pc
	 * @return
	 * @throws AuthenticationException
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) throws AuthenticationException {
		String roleId= (String) this.getSession().getAttribute(SessionDatas.USER_ROLEID);
		SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();
		/*List<PageData> menu = this.menuMapper.getAllMenu(roleId);
		for (PageData pd : menu) {
			simpleAuthorInfo.addStringPermission(pd.getString("permissions"));
		}*/
		return simpleAuthorInfo;
	}
	
	/**
	 * 获得 HttpServletRequest
	 * @时间：2017年7月14日 下午1:37:16
	 * @作者：chen.an
	 * @return
	 */
	private HttpServletRequest getRequrest(){
		return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
	}
	/**
	 * 获得HttpSession
	 * @时间：2017年7月14日 下午1:37:37
	 * @作者：chen.an
	 * @return
	 */
	private HttpSession getSession(){
		return this.getRequrest().getSession();
	}
	
	/**
	 * 初始化菜单
	 * @时间：2017年7月17日 下午1:23:47
	 * @作者：chen.an
	 *//*
	private void initMenu(){
		List<PageData> types = this.menuMapper.getMenyType();
//		List<PageData> menus = new ArrayList<>();
		PageData menus = new PageData();
		//条件
		PageData mp = new PageData(); 
		mp.put("hide", "1");
//		mp.put("parent_id", "-1");
		mp.put("permissions", "-1");
		for (PageData type : types) {
			String t =  type.get("type").toString();
			mp.put("type",t);
			List<PageData> list = this.menuMapper.getAllList(mp);
//			PageData pd= new PageData();
//			pd.put("menuType", t);
//			pd.put("menuList", list);
//			menus.add(pd);
			menus.put(t, list);
		}
		
		this.getSession().setAttribute(SessionDatas.MENU_TYPE, types);
		this.getSession().setAttribute(SessionDatas.MENU_MAP, menus);
		
	}*/
}
